// utils/saveImageUtil.js

/**
 * 图片保存工具类
 */
export default class SaveImageUtil {
    /**
     * 保存Base64图片到相册
     * @param {string} base64Data 带前缀的Base64图片数据
     * @param {string} fileName 可选文件名（不带后缀）
     * @param {string} fileType 可选文件类型（jpg/png）
     * @returns {Promise<void>}
     */
    static async saveBase64ToAlbum(base64Data, fileName = '', fileType = 'jpg') {
      try {
        // 检查平台支持
        if (!this.#isSupport()) {
          throw new Error('当前平台不支持此功能');
        }
  
        // 处理Base64数据
        const { pureBase64, mimeType } = this.#processBase64Data(base64Data);
        
        // 生成文件路径
        const filePath = this.#generateFilePath(fileName, fileType);
        
        // 写入临时文件
        await this.#writeTempFile(pureBase64, filePath);
        
        // 保存到相册
        await this.#saveToAlbum(filePath);
        
        return { success: true, message: '保存成功' };
      } catch (error) {
        console.error('保存图片失败:', error);
        
        // 处理权限问题
        if (this.#isPermissionError(error)) {
          const result = await this.#requestPermission();
          if (result) {
            // 用户授权后重新尝试
            return this.saveBase64ToAlbum(base64Data, fileName, fileType);
          }
          return { success: false, message: '用户拒绝授权' };
        }
        
        return { 
          success: false, 
          message: error.message || '保存图片失败' 
        };
      }
    }
  
    // 私有方法：检查平台支持
    static #isSupport() {
      // #ifdef MP-WEIXIN
      return true;
      // #endif
      
      // #ifdef H5
      return false; // H5需要不同实现
      // #endif
      
      return false;
    }
  
    // 私有方法：处理Base64数据
    static #processBase64Data(base64Data) {
      const matches = base64Data.match(/^data:(image\/\w+);base64,(.+)$/);
      if (!matches || matches.length < 3) {
        throw new Error('Base64格式不正确');
      }
      
      return {
        mimeType: matches[1],
        pureBase64: matches[2]
      };
    }
  
    // 私有方法：生成文件路径
    static #generateFilePath(fileName, fileType) {
      // #ifdef MP-WEIXIN
      const name = fileName || `img_${Date.now()}`;
      return `${wx.env.USER_DATA_PATH}/${name}.${fileType}`;
      // #endif
      
      return '';
    }
  
    // 私有方法：写入临时文件
    static #writeTempFile(base64Data, filePath) {
      return new Promise((resolve, reject) => {
        // #ifdef MP-WEIXIN
        const fs = wx.getFileSystemManager();
        try {
          fs.writeFile({
            filePath,
            data: base64Data,
            encoding: 'base64',
            success: resolve,
            fail: reject
          });
        } catch (error) {
          reject(error);
        }
        // #endif
      });
    }
  
    // 私有方法：保存到相册
    static #saveToAlbum(filePath) {
      return new Promise((resolve, reject) => {
        uni.saveImageToPhotosAlbum({
          filePath,
          success: resolve,
          fail: reject
        });
      });
    }
  
    // 私有方法：检查是否是权限错误
    static #isPermissionError(error) {
      return error && error.errMsg && (
        error.errMsg.includes('auth deny') || 
        error.errMsg.includes('auth denied') ||
        error.errMsg.includes('permission')
      );
    }
  
    // 私有方法：请求权限
    static #requestPermission() {
      return new Promise((resolve) => {
        uni.showModal({
          title: '权限申请',
          content: '需要您授权访问相册权限',
          confirmText: '去设置',
          success: (res) => {
            if (res.confirm) {
              uni.openSetting({
                success: (settingRes) => {
                  resolve(settingRes.authSetting['scope.writePhotosAlbum'] === true);
                },
                fail: () => resolve(false)
              });
            } else {
              resolve(false);
            }
          },
          fail: () => resolve(false)
        });
      });
    }
  }